// Embranchement : duplique la conversation jusqu'à un message donné. import { NextResponse } from "next/server"; import { z } from "zod"; import { apiError, parseBody } from "@/lib/api.ts"; import { assertSameOrigin, requireUser } from "@/lib/auth/session.ts"; import { all, get, run, transaction } from "@/lib/db/index.ts"; const schema = z.object({ upToMessageId: z.number().int().positive() }); export async function POST(req: Request, ctx: { params: Promise<{ id: string }> }) { try { await assertSameOrigin(); const user = await requireUser(); const id = parseInt((await ctx.params).id, 10); const conv = get<{ id: number; title: string; course_code: string | null; mode: string; knowledge_mode: string; model: string }>( "SELECT id, title, course_code, mode, knowledge_mode, model FROM conversations WHERE id = ? AND user_id = ?", id, user.id ); if (!conv) return NextResponse.json({ error: "Conversation introuvable." }, { status: 404 }); const { upToMessageId } = await parseBody(req, schema); const newId = transaction(() => { const r = run( `INSERT INTO conversations (user_id, course_code, title, mode, knowledge_mode, model, parent_conversation_id, branched_from_message_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, user.id, conv.course_code, conv.title + " (branche)", conv.mode, conv.knowledge_mode, conv.model, conv.id, upToMessageId ); const nid = Number(r.lastInsertRowid); const msgs = all<{ role: string; content: string; citations: string; attachments: string; model: string; mode: string; knowledge_mode: string }>( "SELECT role, content, citations, attachments, model, mode, knowledge_mode FROM messages WHERE conversation_id = ? AND id <= ? ORDER BY id", conv.id, upToMessageId ); for (const m of msgs) { run( "INSERT INTO messages (conversation_id, role, content, citations, attachments, model, mode, knowledge_mode) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", nid, m.role, m.content, m.citations, m.attachments, m.model, m.mode, m.knowledge_mode ); } return nid; }); return NextResponse.json({ ok: true, conversationId: newId }); } catch (e) { return apiError(e); } }